package cn.zifangsky.jvm.part1.structure.holder;

import lombok.Data;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

/**
 * Holder测试1
 *
 * @author zifangsky
 * @date 2020/7/2
 * @since 1.0.0
 */
public class HolderTest1 {

    /**
     * 如果想要同时获取“低卡路里的菜肴名单，以及名单中的最低卡路里”，不用 Holder 的做法
     */
    public static void main(String[] args) {
        List<Dish> menuList = Arrays.asList(
                new Dish("猪肉", false, 800, Dish.Type.MEAT),
                new Dish("牛肉", false, 700, Dish.Type.MEAT),
                new Dish("鸡肉", false, 400, Dish.Type.MEAT),
                new Dish("薯条", true, 530, Dish.Type.OTHER),
                new Dish("米饭", true, 350, Dish.Type.OTHER),
                new Dish("水果", true, 120, Dish.Type.OTHER),
                new Dish("比萨饼", true, 550, Dish.Type.OTHER),
                new Dish("大虾", false, 300, Dish.Type.FISH),
                new Dish("龙利鱼", false, 450, Dish.Type.FISH) );

        //获取低卡路里的菜肴名单，以及名单中的最低卡路里
        DishResp resp = getLowCaloricDishes(menuList);
        System.out.println(resp);
    }

    /**
     * 获取低卡路里的菜肴名单，以及名单中的最低卡路里
     */
    private static DishResp getLowCaloricDishes(List<Dish> menuList){
        //1. 获取低卡路里的菜肴
        List<Dish> lowCaloricDishes = menuList.stream()
                //卡路里小于450
                .filter(m -> m.getCalories() < 450)
                .sorted(Comparator.comparing(Dish::getCalories))
                .collect(Collectors.toList());

        //2. 获取名单中的最低卡路里
        int minCalorie = lowCaloricDishes.stream()
                .min(Comparator.comparing(Dish::getCalories))
                .get().getCalories();

        return new DishResp(lowCaloricDishes, minCalorie);
    }


    /**
     * 对返回数据进行包装
     */
    @Data
    static class DishResp {
        /**
         * 低卡路里的菜肴
         */
        private List<Dish> lowCaloricDishes;
        /**
         * 最低卡路里
         */
        private int minCalorie;

        public DishResp(List<Dish> lowCaloricDishes, int minCalorie) {
            this.lowCaloricDishes = lowCaloricDishes;
            this.minCalorie = minCalorie;
        }
    }

}
